function f_check_work_is_run()
{   #检查是否已经有任务再跑. 避免同个表多个任务跑, 就是说同一个表是串行跑
    declare __t __tools _pid _pid_is_run _wait_time _first_queue_name _queue_name _wait_mark fun_name
    fun_name="f_check_work_is_run"
    __tools="${1}"
    __t="${2}"
    _queue_name="${mysql_port}_${mysql_db}_${__t}_${_PPID}.queue"                 #任务队列文件名, 每个人物默认会加入到队列中, 同表的话串行执行
    script_queue_file="${script_queue_dir}/${_queue_name}"                        #队列文件路径
    touch "${script_queue_file}"
    script_queue_file_list+=("${script_queue_file}")
    _wait_mark=1
    for ((_wait_time=0; _wait_time<=${wait_time_for_work}; _wait_time++))
    do
        if [ -f "${osc_run_mark_file}" ]
        then #标志文件存在的话, 判断标志文件里面保存的pid对应的进程是否还运行
            _pid="$(cat ${osc_run_mark_file})"
            _pid_is_run="$(ps -ef|grep "${script_file_name}"|awk '{print $2" "$3}'|grep -wc "${_pid}")" || true

            if [ "${_pid_is_run}x" == "0x" ]
            then
                { [ -f "${osc_run_mark_file}" ] && chattr -i ${osc_run_mark_file} && rm -f "${osc_run_mark_file}";} || true
                f_logging "REMAIND:${fun_name}" "该表 '${mysql_db}.${__t}' 上次改表操作异常终止, 现在将标志文件删除 '${osc_run_mark_file}'"
            elif [ "$((${_wait_time}%600))x" == "0x" ] #十分钟打印一次这个日志
            then
                f_logging "WARN:${fun_name}" "该表 '${mysql_db}.${__t}' 已经有${__tools}任务在跑 '${osc_run_mark_file}', 请等待."
            fi
        fi

        if [ ! -f "${osc_run_mark_file}" ] || [ "${_pid_is_run}x" == "0x" ]
        then #如果标志文件不存在, 或者标志文件内保存的pid对应的进程未运行, 且队列中第一个进入队列的是本任务, 则退出循环, 开始改表
             #队列是通过任务执行的时间生成队列文件, 以时间排序判断哪个是第一个
            _first_queue_name="$(ls -lrt ${script_queue_dir}|awk '{print $NF}'|grep -P "^${mysql_port}_${mysql_db}_${__t}_"|head -1)" || true
            _first_queue_name_pid="$(awk -F '_' '{print $NF}' <<< "${_first_queue_name}"|awk -F. '{print $1}')"
            if [ "${_first_queue_name}x" == "${_queue_name}x" ]
            then #当前改表任务的队列文件名等于第一个队列文件名, 就开始改表
                _wait_mark=0
                break
            elif [ "${_first_queue_name_pid}x" == "${_pid}x" ] || [ -z "${_pid}" ]
            then #如果异常终止的pid正好是队列的第一个任务, 就将队列标志文件删除
                f_logging "REMAIND:${fun_name}" "该表 '${mysql_db}.${__t}' 上次改表操作异常终止, 现在将 '${_first_queue_name}' 从队列中移除"
                { [ -f "${script_queue_dir}/${_first_queue_name}" ] && rm -f "${script_queue_dir}/${_first_queue_name}";} || true
            elif [ ${_wait_time} -gt 10 ]
            then #异常现象, 一般不会出现
                __="队列文件 : $(ls -lrt ${script_queue_dir}), 第一个队列文件 : ${_first_queue_name}"
                __="该表 '${mysql_db}.${__t}' 没有${__tools}任务在跑, 但是在队列中没有找到合适的任务, 这是异常现象. [ ${__} ]"
                f_logging "ERROR:${fun_name}" "${__}" "2" "1"
            fi
        fi

        [ -f "${script_queue_dir}/stop_file_for_${mysql_port}" ] && break #这是退出的标志文件, 人为生成这个文件, 可以安全退出, 避免暴力终止而没有清理临时文件

        sleep 1

    done
    [ "${_wait_mark}x" == "1x" ] && f_logging "ERROR:${fun_name}" "该表 '${mysql_db}.${__t}' 已经有${__tools}任务在跑 '${osc_run_mark_file}', 请稍后再试." "2" "1"
    # 创建一个标志文件, 防止同个表同时多个任务执行, 生成标志文件后, 会给标志文件加上锁, 防止人为误删除及其他任务改这个文件
    # 从这个维度也能控制不会出现多个任务同时改一个表
    echo "${_PPID}" > ${osc_run_mark_file} && chattr +i ${osc_run_mark_file} || f_logging "ERROR:${fun_name}" "创建标志文件失败 ] [ ${osc_run_mark_file}" "2" "1"
    f_logging "INFO:${fun_name}" "该表 '${mysql_db}.${__t}' 改表任务开始 '${osc_run_mark_file}'." "execute:${execute}"
    return 0
}

